*
*/
#if HAVE_LIBEXPAT
-int XMLCALL cet_lib_expat_UnknownEncodingHandler(void *data, const XML_Char *encoding, XML_Encoding *info)
+int XMLCALL cet_lib_expat_UnknownEncodingHandler(void *data, const XML_Char *xml_encoding, XML_Encoding *info)
{
cet_cs_vec_t *cs;
int i, c, ucs4_def;
+ const char *encoding;
+ encoding = xml_convert_to_char_string(xml_encoding);
cs = cet_find_cs_by_name(encoding);
if (cs == NULL) return XML_STATUS_ERROR; /* fatal(MYNAME ": Unknown character set \"%s\"!\n", encoding); */
if (global_opts.verbose_status > 0)
printf(MYNAME ": XML parser - encoding handler for character set \"%s\" established.\n", encoding);
+ xml_free_converted_string(encoding);
return XML_STATUS_OK;
}
#endif
return res;
}
+
+
+const char *xml_convert_to_char_string(const XML_Char *str)
+{
+#ifdef XML_UNICODE
+ return cet_str_uni_to_utf8(str, wcslen(str));
+#else
+ return str;
+#endif
+}
+
+void xml_free_converted_string(const char *str)
+{
+#ifdef XML_UNICODE
+ xfree(str);
+#endif
+}
+
+const char **xml_convert_attrs_to_char_string(const XML_Char **xml_attr)
+{
+#ifdef XML_UNICODE
+ // First count size of array
+ int size = 0;
+ int i;
+ const XML_Char **ptr;
+ const char **char_attrs;
+
+ if (xml_attr == NULL)
+ return NULL;
+
+ for (ptr = xml_attr; *ptr != NULL; ++ptr)
+ ++size;
+
+ // Allocate space
+ char_attrs = xmalloc((size + 1) * sizeof(char *));
+
+ // Duplicate strings
+ for (i = 0; i < size; ++i)
+ char_attrs[i] = xml_convert_to_char_string(xml_attr[i]);
+ char_attrs[size] = NULL;
+
+ return char_attrs;
+#else
+ return xml_attr;
+#endif
+}
+
+void xml_free_converted_attrs(const char **attr)
+{
+#ifdef XML_UNICODE
+ while (attr != NULL && *attr != NULL) {
+ xfree(*attr);
+ ++attr;
+ }
+#endif
+}
void cet_disp_character_set_names(FILE *fout);
+/*
+ * Conversion from XML_Char string to char string. If XML_Char is the
+ * same as char, these routines do nothing. If XML_Char is a wide
+ * character, xml_convert_to_char_string converts the string to a
+ * newly allocated char string, and xml_free_converted_string frees
+ * it.
+ */
+
+const char *xml_convert_to_char_string(const XML_Char *str);
+void xml_free_converted_string(const char *str);
+
+const char **xml_convert_attrs_to_char_string(const XML_Char **xml_attr);
+void xml_free_converted_attrs(const char **attr);
+
#endif
/* Start processing an XML item */
static void
-ce_start(void *data, const char *el, const char **attr)
+ce_start(void *data, const XML_Char *xml_el, const XML_Char **xml_attr)
{
+ const char *el = xml_convert_to_char_string(xml_el);
const char **ap;
+ const char **attr;
+
+ attr = xml_convert_attrs_to_char_string(xml_attr);
strcpy(element, el);
if (0 == strcmp(el, "Route")) {
inRoute = 1;
}
}
}
+ xml_free_converted_string(el);
+ xml_free_converted_attrs(attr);
}
/* Finish processing an XML item */
static void
-ce_end(void *data, const char *el)
+ce_end(void *data, const XML_Char *xml_el)
{
+ const char *el = xml_convert_to_char_string(xml_el);
if (0 == strcmp(el, "Route")) {
if (!doing_rtes)
ce_free_route(currentRoute);
}
else if (0 == strcmp(el, "Mark"))
inMark = 0;
+ xml_free_converted_string(el);
}
/* Process some XML character data for the current item */
static void
-ce_cdata(void *dta, const XML_Char *s, int len)
+ce_cdata(void *dta, const XML_Char *xml_s, int len)
{
+ const char *s = xml_convert_to_char_string(xml_s);
if (*s != '\n') {
char *edatastr;
// We buffer up characters in 'cdatastr' until a single <lf> is received
// Start building a new string since we are done with this one
cdatastr[0] = '\0';
}
+
+ xml_free_converted_string(s);
}
/* Set up reading the CE input file */
#include "cet_util.h"
#include "inifile.h"
+// Turn on Unicode in expat?
+#ifdef _UNICODE
+# define XML_UNICODE
+#endif
/*
* Amazingly, this constant is not specified in the standard...
int attr_count = 0;
xml_tag *new_tag;
fs_xml *fs_gpx;
-
+
if ( !fs_ptr ) {
return;
}
- new_tag = (xml_tag *)xcalloc(sizeof(xml_tag),1);
- new_tag->tagname = xstrdup(el);
+ new_tag = (xml_tag *)xcalloc(sizeof(xml_tag),1);
+ new_tag->tagname = xstrdup(el);
/* count attributes */
while (*avp) {
}
static void
-gpx_start(void *data, const char *el, const char **attr)
+gpx_start(void *data, const XML_Char *xml_el, const XML_Char **xml_attr)
{
char *e;
char *ep;
int passthrough;
+ const char *el = xml_convert_to_char_string(xml_el);
+ const char **attr = xml_convert_attrs_to_char_string(xml_attr);
vmem_realloc(¤t_tag, strlen(current_tag.mem) + 2 + strlen(el));
e = current_tag.mem;
if (passthrough) {
start_something_else(el, attr);
}
+ xml_free_converted_string(el);
+ xml_free_converted_attrs(attr);
}
struct
rv = mkgmtime(&tm) - off_sign*off_hr*3600 - off_sign*off_min*60;
- xfree(timestr);
+ xfree(timestr);
return rv;
}
static void
-gpx_end(void *data, const char *el)
+gpx_end(void *data, const XML_Char *xml_el)
{
+ const char *el = xml_convert_to_char_string(xml_el);
char *s = strrchr(current_tag.mem, '/');
float x;
char *cdatastrp = cdatastr.mem;
}
*s = 0;
+ xml_free_converted_string(el);
}
#if ! HAVE_LIBEXPAT
xfree(tag->parentcdata);
}
if (tag->tagname) {
- xfree(tag->tagname);
+ xfree(tag->tagname);
}
if (tag->attributes) {
ap = tag->attributes;
fatal(MYNAME ": gpx version number of '%s' not valid.\n", gpx_wversion);
}
- now = current_time();
+ now = current_time();
short_length = atoi(snlen);
#else
static void
-hsa_ndv_start(void *data, const char *el, const char **attr)
+hsa_ndv_start(void *data, const XML_Char *xml_el, const XML_Char **attr)
{
+ const char *el = xml_convert_to_char_string(xml_el);
+
// printf("<%s>\n", el);
if (strcmp(el, "Export") == 0)
{//should only be one
}
//reset data :)
memset(cdatastr,0, MY_CBUF);
+ xml_free_converted_string(el);
}
static void
-hsa_ndv_end(void *data, const char *el)
+hsa_ndv_end(void *data, const XML_Char *xml_el)
{
+ const char *el = xml_convert_to_char_string(xml_el);
if (in_Route)
{
if (strcmp(el, "Version") == 0)
{
in_ChartWork--;
}
+ xml_free_converted_string(el);
}
static void
static const char vowels[] = "aeiouAEIOU";
#define DEFAULT_TARGET_LEN 8
-#define DEFAULT_BADCHARS "\"$.,'!-"
+static const char *DEFAULT_BADCHARS = "\"$.,'!-";
/*
* Hash table tunings. The reality is that our hash doesn't have to be
}
static void
-nav_start(void *data, const char *el, const char **attr)
+nav_start(void *data, const XML_Char *xml_el, const XML_Char **xml_attr)
{
+ const char *el;
+ const char **attr;
+
+ el = xml_convert_to_char_string(xml_el);
+ attr = xml_convert_attrs_to_char_string(xml_attr);
if (0 == strcmp(el, "CacheDetails")) {
const char **ap;
wpt_tmp = waypt_new();
}
waypt_add(wpt_tmp);
}
+
+ xml_free_converted_attrs(attr);
+ xml_free_converted_string(el);
}
static void
-nav_end(void *data, const char *el)
+nav_end(void *data, const XML_Char *el)
{
}
static void
-xml_start(void *data, const char *el, const char **attr)
+xml_start(void *data, const XML_Char *xml_el, const XML_Char **xml_attr)
{
char *e;
char *ep;
xg_callback *cb;
+ const char *el;
+ const char **attrs;
+
+ el = xml_convert_to_char_string(xml_el);
+ attrs = xml_convert_attrs_to_char_string(xml_attr);
if (xml_consider_ignoring(el))
return;
cb = xml_tbl_lookup(e, cb_start);
if (cb) {
- (*cb)(NULL, attr);
+ (*cb)(NULL, attrs);
}
+ xml_free_converted_string(el);
+ xml_free_converted_attrs(attrs);
}
#if HAVE_LIBEXPAT
static void
-xml_cdata(void *dta, const XML_Char *s, int len)
+xml_cdata(void *dta, const XML_Char *xml_s, int len)
{
char *estr;
+ const char *s = xml_convert_to_char_string(xml_s);
vmem_realloc(&cdatastr, 1 + len + strlen(cdatastr.mem));
estr = (char *) cdatastr.mem + strlen(cdatastr.mem);
memcpy(estr, s, len);
estr[len] = 0;
+ xml_free_converted_string(s);
}
static void
-xml_end(void *data, const char *el)
+xml_end(void *data, const XML_Char *xml_el)
{
char *s = strrchr(current_tag.mem, '/');
+ const char *el = xml_convert_to_char_string(xml_el);
xg_callback *cb;
if (xml_consider_ignoring(el))
(*cb)(el, NULL);
}
*s = 0;
+ xml_free_converted_string(el);
}
void xml_read(void)